{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "1e6b039f",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.keras.layers import Dropout, Dense, SimpleRNN\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import pandas as pd\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.metrics import mean_squared_error, mean_absolute_error\n",
    "import math"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "598b766c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "numpy 1.21.4\n",
      "pandas 1.3.4\n",
      "tensorflow 2.7.0\n"
     ]
    }
   ],
   "source": [
    "for module in np, pd, tf:\n",
    "     print (module.__name__, module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "f2b9f998",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 这两行代码解决 plt 中文显示的问题\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "19b9fe5b",
   "metadata": {},
   "outputs": [],
   "source": [
    "stock = pd.read_csv('../dataset/sh600031.csv')  # 读取股票文件"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ecdba8e7",
   "metadata": {},
   "source": [
    "# 增添一列T+1涨跌数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "c5bcf0a4",
   "metadata": {},
   "outputs": [],
   "source": [
    "datalist = list()\n",
    "# 上市第一天都设为涨\n",
    "datalist.append(1)\n",
    "for i in range(1,len(stock)):\n",
    "    if stock.iloc[i,list(stock.columns).index('close')]>stock.iloc[i-1,list(stock.columns).index('close')]:\n",
    "        datalist.append(1)\n",
    "    else :\n",
    "        datalist.append(0)\n",
    "stock['chan'] = datalist\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "5c2c83b9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>date</th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "      <th>volume</th>\n",
       "      <th>chan</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2003-07-03</td>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "      <td>33816715</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2003-07-04</td>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "      <td>7697544</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2003-07-07</td>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "      <td>3951205</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2003-07-08</td>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "      <td>2117357</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2003-07-09</td>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "      <td>3440447</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "         date   open   high    low  close    volume  chan\n",
       "0  2003-07-03  23.00  23.00  20.10  21.30  33816715     1\n",
       "1  2003-07-04  21.30  22.18  21.05  21.84   7697544     1\n",
       "2  2003-07-07  21.90  21.96  21.51  21.80   3951205     0\n",
       "3  2003-07-08  21.80  22.22  21.70  21.91   2117357     1\n",
       "4  2003-07-09  21.75  22.65  21.70  22.47   3440447     1"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "stock.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d19e9abb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 取除日期外全部特征\n",
    "training_set = stock.iloc[0:int(len(stock) / 5 * 4), 1:]\n",
    "test_set = stock.iloc[int(len(stock) / 5 * 4):, 1:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "98067b71",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3539, 6), (885, 6))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_set.shape , test_set.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "c09b3f35",
   "metadata": {},
   "outputs": [],
   "source": [
    "training_set = training_set.values\n",
    "test_set = test_set.values"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "76fafde1",
   "metadata": {},
   "source": [
    "# 归一化处理（进行缩放）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cc40ac52",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一化\n",
    "sc = MinMaxScaler(feature_range=(0, 1))  # 定义归一化：归一化到(0，1)之间\n",
    "# 缩放\n",
    "training_set_scaled = sc.fit_transform(training_set)  # 求得训练集的最大值，最小值这些训练集固有的属性，并在训练集上进行归一化\n",
    "test_set = sc.transform(test_set)  # 利用训练集的属性对测试集进行归一化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e4ecce28",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.05522682, 0.05507641, 0.05927126, 0.05862832, 0.07466331,\n",
       "        1.        ],\n",
       "       [0.05689577, 0.05916175, 0.0617004 , 0.06257901, 0.13024207,\n",
       "        1.        ],\n",
       "       [0.05947504, 0.06022091, 0.06445344, 0.06352718, 0.11363668,\n",
       "        1.        ],\n",
       "       ...,\n",
       "       [0.27901684, 0.27674383, 0.28987854, 0.28334387, 0.14002392,\n",
       "        0.        ],\n",
       "       [0.27218935, 0.27507944, 0.2859919 , 0.28603034, 0.13212227,\n",
       "        1.        ],\n",
       "       [0.27279624, 0.27583598, 0.2897166 , 0.28223767, 0.10478023,\n",
       "        0.        ]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "b8ddb695",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 参数设置\n",
    "# 步进值\n",
    "seq_len = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "407cfaf6",
   "metadata": {},
   "source": [
    "#  训练集处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "72443933",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_train = []\n",
    "y_train = []\n",
    "\n",
    "# 数据进行分组\n",
    "for i in range(seq_len, len(training_set_scaled)):\n",
    "    # 全部特征\n",
    "    x_train.append(training_set_scaled[i - seq_len:i, 0:])\n",
    "    # T+1的涨跌幅\n",
    "    y_train.append(training_set_scaled[i, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('chan')])\n",
    "\n",
    "# 将训练集由list格式变为array格式\n",
    "x_train, y_train = np.array(x_train), np.array(y_train)\n",
    "x_train = np.reshape(x_train, (x_train.shape[0], seq_len, training_set.shape[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7139fe95",
   "metadata": {},
   "source": [
    "# 测试集处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d1080c88",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_test = []\n",
    "y_test = []\n",
    "\n",
    "# 利用for循环，遍历整个测试集，提取测试集中连续5天的开盘价作为输入特征x_train，第6天的数据作为标签\n",
    "for i in range(seq_len, len(test_set)):\n",
    "    # 全部特征\n",
    "    x_test.append(test_set[i - seq_len:i, 0:])\n",
    "    # T+1的涨跌幅\n",
    "    y_test.append(test_set[i, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('chan')])\n",
    "\n",
    "    # 测试集变array并reshape为符合RNN输入要求：[送入样本数， 循环核时间展开步数， 每个时间步输入特征个数]\n",
    "x_test, y_test = np.array(x_test), np.array(y_test)\n",
    "x_test = np.reshape(x_test, (x_test.shape[0], seq_len, test_set.shape[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "985ffc61",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = tf.keras.Sequential([\n",
    "    SimpleRNN(80, return_sequences=True),\n",
    "    Dropout(0.2),\n",
    "    SimpleRNN(100),\n",
    "    Dropout(0.2),\n",
    "    Dense(1)\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "e0627142",
   "metadata": {},
   "outputs": [],
   "source": [
    "model.compile(optimizer=tf.keras.optimizers.Adam(0.001),loss='mean_squared_error')  \n",
    "# 损失函数用均方误差\n",
    "# 该应用只观测loss数值，不观测准确率，所以删去metrics选项，一会在每个epoch迭代显示时只显示loss值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "6b862f3c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-------------load the model-----------------\n"
     ]
    }
   ],
   "source": [
    "checkpoint_save_path = \"./checkpoint/rnn_stock.ckpt\"\n",
    "if os.path.exists(checkpoint_save_path + '.index'):\n",
    "    print('-------------load the model-----------------')\n",
    "    model.load_weights(checkpoint_save_path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "4dd4f75d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 训练参数\n",
    "batch_size = 64\n",
    "epochs = 100\n",
    "validation_freq=1\n",
    "# 等等"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "943e6a5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/100\n",
      "56/56 [==============================] - 5s 22ms/step - loss: 0.2843 - val_loss: 0.2590\n",
      "Epoch 2/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.2541 - val_loss: 0.2557\n",
      "Epoch 3/100\n",
      "56/56 [==============================] - 1s 11ms/step - loss: 0.2525 - val_loss: 0.2530\n",
      "Epoch 4/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2510 - val_loss: 0.2531\n",
      "Epoch 5/100\n",
      "56/56 [==============================] - 1s 10ms/step - loss: 0.2524 - val_loss: 0.2521\n",
      "Epoch 6/100\n",
      "56/56 [==============================] - 0s 8ms/step - loss: 0.2506 - val_loss: 0.2519\n",
      "Epoch 7/100\n",
      "56/56 [==============================] - 0s 8ms/step - loss: 0.2516 - val_loss: 0.2517\n",
      "Epoch 8/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2528 - val_loss: 0.2546\n",
      "Epoch 9/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2513\n",
      "Epoch 10/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2509 - val_loss: 0.2511\n",
      "Epoch 11/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2503 - val_loss: 0.2523\n",
      "Epoch 12/100\n",
      "56/56 [==============================] - 0s 8ms/step - loss: 0.2508 - val_loss: 0.2511\n",
      "Epoch 13/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2517\n",
      "Epoch 14/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2506 - val_loss: 0.2514\n",
      "Epoch 15/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2513 - val_loss: 0.2530\n",
      "Epoch 16/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2510 - val_loss: 0.2540\n",
      "Epoch 17/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2514 - val_loss: 0.2508\n",
      "Epoch 18/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2507 - val_loss: 0.2545\n",
      "Epoch 19/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2502 - val_loss: 0.2511\n",
      "Epoch 20/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2525 - val_loss: 0.2508\n",
      "Epoch 21/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2508 - val_loss: 0.2503\n",
      "Epoch 22/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2517 - val_loss: 0.2509\n",
      "Epoch 23/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2512\n",
      "Epoch 24/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2512 - val_loss: 0.2507\n",
      "Epoch 25/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2519 - val_loss: 0.2506\n",
      "Epoch 26/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2501 - val_loss: 0.2541\n",
      "Epoch 27/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2513 - val_loss: 0.2546\n",
      "Epoch 28/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2506 - val_loss: 0.2510\n",
      "Epoch 29/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2514 - val_loss: 0.2507\n",
      "Epoch 30/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2512 - val_loss: 0.2504\n",
      "Epoch 31/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2511 - val_loss: 0.2504\n",
      "Epoch 32/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2513 - val_loss: 0.2513\n",
      "Epoch 33/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2510\n",
      "Epoch 34/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2533\n",
      "Epoch 35/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2510 - val_loss: 0.2513\n",
      "Epoch 36/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2555\n",
      "Epoch 37/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2520 - val_loss: 0.2508\n",
      "Epoch 38/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2511 - val_loss: 0.2515\n",
      "Epoch 39/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2502 - val_loss: 0.2504\n",
      "Epoch 40/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2509 - val_loss: 0.2502\n",
      "Epoch 41/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2524\n",
      "Epoch 42/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2495 - val_loss: 0.2518\n",
      "Epoch 43/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2506 - val_loss: 0.2505\n",
      "Epoch 44/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2522 - val_loss: 0.2502\n",
      "Epoch 45/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2509 - val_loss: 0.2507\n",
      "Epoch 46/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2510 - val_loss: 0.2536\n",
      "Epoch 47/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2517 - val_loss: 0.2503\n",
      "Epoch 48/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2514 - val_loss: 0.2522\n",
      "Epoch 49/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2503 - val_loss: 0.2505\n",
      "Epoch 50/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2504 - val_loss: 0.2511\n",
      "Epoch 51/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2502 - val_loss: 0.2595\n",
      "Epoch 52/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2508 - val_loss: 0.2544\n",
      "Epoch 53/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2502 - val_loss: 0.2511\n",
      "Epoch 54/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2501 - val_loss: 0.2540\n",
      "Epoch 55/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2507 - val_loss: 0.2519\n",
      "Epoch 56/100\n",
      "56/56 [==============================] - 0s 8ms/step - loss: 0.2505 - val_loss: 0.2502\n",
      "Epoch 57/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2520\n",
      "Epoch 58/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2507 - val_loss: 0.2517\n",
      "Epoch 59/100\n",
      "56/56 [==============================] - 0s 8ms/step - loss: 0.2507 - val_loss: 0.2501\n",
      "Epoch 60/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2506 - val_loss: 0.2496\n",
      "Epoch 61/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2510 - val_loss: 0.2506\n",
      "Epoch 62/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2513 - val_loss: 0.2523\n",
      "Epoch 63/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2502\n",
      "Epoch 64/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2510 - val_loss: 0.2522\n",
      "Epoch 65/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2508 - val_loss: 0.2507\n",
      "Epoch 66/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2529\n",
      "Epoch 67/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2507 - val_loss: 0.2504\n",
      "Epoch 68/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2511 - val_loss: 0.2515\n",
      "Epoch 69/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2520\n",
      "Epoch 70/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2515 - val_loss: 0.2514\n",
      "Epoch 71/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2505 - val_loss: 0.2506\n",
      "Epoch 72/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2506 - val_loss: 0.2503\n",
      "Epoch 73/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2505 - val_loss: 0.2508\n",
      "Epoch 74/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2517 - val_loss: 0.2555\n",
      "Epoch 75/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2508 - val_loss: 0.2519\n",
      "Epoch 76/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2500 - val_loss: 0.2499\n",
      "Epoch 77/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2504 - val_loss: 0.2533\n",
      "Epoch 78/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2502 - val_loss: 0.2522\n",
      "Epoch 79/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2506 - val_loss: 0.2514\n",
      "Epoch 80/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2503 - val_loss: 0.2500\n",
      "Epoch 81/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2510 - val_loss: 0.2536\n",
      "Epoch 82/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2512 - val_loss: 0.2511\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 83/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2507 - val_loss: 0.2524\n",
      "Epoch 84/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2516 - val_loss: 0.2514\n",
      "Epoch 85/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2504 - val_loss: 0.2515\n",
      "Epoch 86/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2502 - val_loss: 0.2504\n",
      "Epoch 87/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2501 - val_loss: 0.2513\n",
      "Epoch 88/100\n",
      "56/56 [==============================] - 0s 5ms/step - loss: 0.2509 - val_loss: 0.2533\n",
      "Epoch 89/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2505 - val_loss: 0.2501\n",
      "Epoch 90/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2506 - val_loss: 0.2504\n",
      "Epoch 91/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2498 - val_loss: 0.2524\n",
      "Epoch 92/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2509 - val_loss: 0.2550\n",
      "Epoch 93/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2500 - val_loss: 0.2510\n",
      "Epoch 94/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2508 - val_loss: 0.2509\n",
      "Epoch 95/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2513 - val_loss: 0.2503\n",
      "Epoch 96/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2507 - val_loss: 0.2530\n",
      "Epoch 97/100\n",
      "56/56 [==============================] - 0s 7ms/step - loss: 0.2510 - val_loss: 0.2510\n",
      "Epoch 98/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2502 - val_loss: 0.2501\n",
      "Epoch 99/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2504 - val_loss: 0.2572\n",
      "Epoch 100/100\n",
      "56/56 [==============================] - 0s 6ms/step - loss: 0.2513 - val_loss: 0.2522\n",
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      " Layer (type)                Output Shape              Param #   \n",
      "=================================================================\n",
      " simple_rnn (SimpleRNN)      (None, 1, 80)             6960      \n",
      "                                                                 \n",
      " dropout (Dropout)           (None, 1, 80)             0         \n",
      "                                                                 \n",
      " simple_rnn_1 (SimpleRNN)    (None, 100)               18100     \n",
      "                                                                 \n",
      " dropout_1 (Dropout)         (None, 100)               0         \n",
      "                                                                 \n",
      " dense (Dense)               (None, 1)                 101       \n",
      "                                                                 \n",
      "=================================================================\n",
      "Total params: 25,161\n",
      "Trainable params: 25,161\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n",
    "                                                 save_weights_only=True,\n",
    "                                                 save_best_only=True,\n",
    "                                                 monitor='val_loss')\n",
    "\n",
    "_model = model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_test, y_test), validation_freq=validation_freq,\n",
    "                   callbacks=[cp_callback])\n",
    "\n",
    "model.summary()\n",
    "\n",
    "file = open('./weights.txt', 'w')  # 参数提取\n",
    "for v in model.trainable_variables:\n",
    "    file.write(str(v.name) + '\\n')\n",
    "    file.write(str(v.shape) + '\\n')\n",
    "    file.write(str(v.numpy()) + '\\n')\n",
    "file.close()\n",
    "\n",
    "loss = _model.history['loss']\n",
    "val_loss = _model.history['val_loss']\n",
    "\n",
    "plt.plot(loss, label='训练损失')\n",
    "plt.plot(val_loss, label='测试损失')\n",
    "plt.title('训练和测试损失')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "a7bfc942",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 预测\n",
    "# 测试集输入模型进行预测\n",
    "predicted_stock_price = model.predict(x_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "d08f0c99",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 归一时是对所有数据列进行的归一\n",
    "# 补充数据列之后才能进行反归一\n",
    "predicted_df = pd.DataFrame(test_set[seq_len:])\n",
    "predicted_df.iloc[:, list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('chan')] = predicted_stock_price\n",
    "predicted_set = predicted_df.values\n",
    "# 对预测数据还原---从（0，1）反归一化到原始范围\n",
    "predicted_stock_price = sc.inverse_transform(predicted_set)\n",
    "# 对真实数据还原---从（0，1）反归一化到原始范围\n",
    "real_stock_price = sc.inverse_transform(test_set[seq_len:])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "fe90d59a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[8.36000000e+00, 8.62000000e+00, 8.36000000e+00, 8.59000000e+00,\n",
       "        1.12531094e+08, 4.66994107e-01],\n",
       "       [8.53000000e+00, 8.69000000e+00, 8.53000000e+00, 8.65000000e+00,\n",
       "        9.81910050e+07, 4.65172410e-01],\n",
       "       [8.65000000e+00, 8.72000000e+00, 8.50000000e+00, 8.51000000e+00,\n",
       "        5.29614480e+07, 4.65829760e-01],\n",
       "       ...,\n",
       "       [2.30000000e+01, 2.30000000e+01, 2.24500000e+01, 2.25600000e+01,\n",
       "        1.20978513e+08, 4.73224312e-01],\n",
       "       [2.25500000e+01, 2.28900000e+01, 2.22100000e+01, 2.27300000e+01,\n",
       "        1.14154802e+08, 4.70604181e-01],\n",
       "       [2.25900000e+01, 2.29400000e+01, 2.24400000e+01, 2.24900000e+01,\n",
       "        9.05427410e+07, 4.77671534e-01]])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predicted_stock_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "4a841942",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 只取涨跌幅\n",
    "real_stock_price = test_set[seq_len:][:,list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('chan')]\n",
    "predicted_stock_price = predicted_set[:,list(stock.iloc[0:int(len(stock) / 5 * 4), 1:].columns).index('chan')]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "fd6c0bec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.46699411, 0.46517241, 0.46582976, 0.46241868, 0.46040818,\n",
       "       0.4622612 , 0.46726933, 0.46148854, 0.46766308, 0.46728969,\n",
       "       0.46391577, 0.46774286, 0.46024472, 0.46726227, 0.4616659 ,\n",
       "       0.46668991, 0.46188685, 0.4663451 , 0.46605158, 0.46719605,\n",
       "       0.46263862, 0.46152985, 0.4679108 , 0.46503568, 0.46198916,\n",
       "       0.4625507 , 0.46731502, 0.46111351, 0.461878  , 0.46173799,\n",
       "       0.46141151, 0.46756703, 0.46833241, 0.46762329, 0.46132961,\n",
       "       0.46677822, 0.46692696, 0.46730846, 0.4670091 , 0.46713758,\n",
       "       0.46246633, 0.46206897, 0.46751624, 0.46093953, 0.46063268,\n",
       "       0.46130472, 0.46640405, 0.45604187, 0.46036631, 0.46393082,\n",
       "       0.4645499 , 0.46003723, 0.45946741, 0.45997962, 0.46155205,\n",
       "       0.46576893, 0.45998445, 0.46568015, 0.45846966, 0.46099678,\n",
       "       0.45980677, 0.46721572, 0.46740437, 0.46233147, 0.46670082,\n",
       "       0.46806264, 0.46243495, 0.46242851, 0.46788359, 0.46648377,\n",
       "       0.46794242, 0.46574792, 0.46056947, 0.46477541, 0.4617154 ,\n",
       "       0.46228015, 0.46721393, 0.46467924, 0.45967808, 0.46437046,\n",
       "       0.46102351, 0.46545106, 0.46225727, 0.45987025, 0.46601737,\n",
       "       0.46180877, 0.46736452, 0.46230331, 0.46225467, 0.46232581,\n",
       "       0.4626247 , 0.46779466, 0.46242297, 0.46247754, 0.46815959,\n",
       "       0.46850896, 0.46700209, 0.46280628, 0.46886754, 0.46222425,\n",
       "       0.46868283, 0.46276557, 0.46841258, 0.46247107, 0.46277338,\n",
       "       0.46239203, 0.46264395, 0.46747994, 0.46230373, 0.4607169 ,\n",
       "       0.46034801, 0.46789593, 0.46696758, 0.4673565 , 0.46818915,\n",
       "       0.46802217, 0.46302009, 0.46772137, 0.46309638, 0.46307093,\n",
       "       0.46261653, 0.46245986, 0.4681569 , 0.46127656, 0.46713954,\n",
       "       0.46790802, 0.46250072, 0.46801606, 0.46052355, 0.46633852,\n",
       "       0.46647772, 0.46142554, 0.46633843, 0.4615989 , 0.46191281,\n",
       "       0.46190229, 0.46699369, 0.46716678, 0.46648526, 0.46694663,\n",
       "       0.4620198 , 0.46774951, 0.46251202, 0.46294379, 0.46281493,\n",
       "       0.46780962, 0.4618876 , 0.46800837, 0.46272048, 0.46193913,\n",
       "       0.46226719, 0.46211699, 0.46217424, 0.46296579, 0.46244717,\n",
       "       0.46832022, 0.46826702, 0.46837327, 0.46268088, 0.46839696,\n",
       "       0.4668065 , 0.46287632, 0.46237549, 0.46280733, 0.46820056,\n",
       "       0.46315277, 0.46863422, 0.46787995, 0.4665266 , 0.46214196,\n",
       "       0.46710518, 0.46223807, 0.46233922, 0.46177873, 0.46199095,\n",
       "       0.46753484, 0.46268386, 0.46821302, 0.46309805, 0.46191663,\n",
       "       0.46210575, 0.46255019, 0.46793574, 0.46759298, 0.46313301,\n",
       "       0.46779591, 0.46289152, 0.46782988, 0.46775961, 0.4671765 ,\n",
       "       0.46803382, 0.46829849, 0.4678973 , 0.46315336, 0.46288544,\n",
       "       0.46833938, 0.46776193, 0.46766713, 0.46767282, 0.46811903,\n",
       "       0.46278024, 0.46270069, 0.46737757, 0.46308368, 0.46727699,\n",
       "       0.46769157, 0.46316403, 0.46315899, 0.4668411 , 0.4620263 ,\n",
       "       0.46837828, 0.46799046, 0.46621379, 0.46495011, 0.46242368,\n",
       "       0.4616394 , 0.46352264, 0.46743447, 0.46118808, 0.46026742,\n",
       "       0.46720189, 0.46166143, 0.46022934, 0.46719241, 0.46456385,\n",
       "       0.46173352, 0.46729237, 0.46548387, 0.46574178, 0.4633607 ,\n",
       "       0.4680286 , 0.46942681, 0.46346056, 0.4608815 , 0.46122974,\n",
       "       0.46798933, 0.46332625, 0.46622461, 0.46510735, 0.46114588,\n",
       "       0.46813336, 0.46641216, 0.46653807, 0.46354502, 0.46834576,\n",
       "       0.46093857, 0.46349633, 0.46137416, 0.46779421, 0.46351376,\n",
       "       0.47027564, 0.46500427, 0.45753965, 0.46912047, 0.46895134,\n",
       "       0.46274468, 0.46866122, 0.46696627, 0.4637486 , 0.46118551,\n",
       "       0.46680608, 0.46312582, 0.4698956 , 0.46648115, 0.4641546 ,\n",
       "       0.46369171, 0.46832299, 0.46957341, 0.462556  , 0.46438187,\n",
       "       0.46961546, 0.47033665, 0.4648273 , 0.47024271, 0.46976486,\n",
       "       0.46780646, 0.46555012, 0.46440953, 0.46407664, 0.46472308,\n",
       "       0.46916199, 0.47001922, 0.46483088, 0.47057578, 0.46752065,\n",
       "       0.46363434, 0.47091255, 0.46435538, 0.46569276, 0.47153938,\n",
       "       0.46980223, 0.46949354, 0.46451312, 0.47177988, 0.46522912,\n",
       "       0.46660385, 0.46499455, 0.47154295, 0.46930218, 0.46529597,\n",
       "       0.46510869, 0.46602213, 0.47186464, 0.46520376, 0.4666096 ,\n",
       "       0.46603414, 0.47086239, 0.47099182, 0.47003555, 0.46518806,\n",
       "       0.46965319, 0.46941674, 0.46538755, 0.46987087, 0.46525514,\n",
       "       0.47115034, 0.47217345, 0.47007427, 0.46528214, 0.46675304,\n",
       "       0.4665564 , 0.47220182, 0.46566212, 0.46613574, 0.46470839,\n",
       "       0.47245166, 0.46660274, 0.46655017, 0.47260019, 0.46533522,\n",
       "       0.4645161 , 0.47132188, 0.46641785, 0.47149587, 0.47104532,\n",
       "       0.4660027 , 0.46570116, 0.46884781, 0.46560585, 0.47064131,\n",
       "       0.46534055, 0.46573973, 0.47131371, 0.47124231, 0.46531552,\n",
       "       0.47121853, 0.46632719, 0.47113568, 0.47129038, 0.46717873,\n",
       "       0.46686661, 0.47333425, 0.46733576, 0.46672601, 0.47343516,\n",
       "       0.47335625, 0.47125098, 0.46689528, 0.4671393 , 0.47338894,\n",
       "       0.46633512, 0.47367728, 0.46790665, 0.47315127, 0.46750966,\n",
       "       0.47372791, 0.47221497, 0.47257042, 0.4727627 , 0.467143  ,\n",
       "       0.46790197, 0.46724069, 0.47379881, 0.47422826, 0.46776128,\n",
       "       0.46630117, 0.47255576, 0.46632013, 0.46727866, 0.47082996,\n",
       "       0.46553293, 0.47121042, 0.47158825, 0.47174269, 0.46661797,\n",
       "       0.47277483, 0.4666011 , 0.46671927, 0.47199547, 0.47308695,\n",
       "       0.47290218, 0.46729338, 0.47256741, 0.47102857, 0.46734059,\n",
       "       0.47362205, 0.46744788, 0.47199988, 0.47291034, 0.46759823,\n",
       "       0.46839678, 0.46706975, 0.47276905, 0.47327074, 0.4678095 ,\n",
       "       0.47195491, 0.47278452, 0.4680444 , 0.47348154, 0.46777016,\n",
       "       0.4659372 , 0.47233462, 0.46678746, 0.47272518, 0.47280577,\n",
       "       0.46812573, 0.46835062, 0.47223157, 0.47436035, 0.47336653,\n",
       "       0.47364742, 0.47438532, 0.47435191, 0.47408742, 0.47308439,\n",
       "       0.46951663, 0.46699947, 0.4739086 , 0.46841756, 0.47459328,\n",
       "       0.47506672, 0.46794358, 0.46882507, 0.46928102, 0.47565472,\n",
       "       0.46898085, 0.47459304, 0.46556765, 0.47383463, 0.46691501,\n",
       "       0.46284264, 0.46996531, 0.4718895 , 0.47302854, 0.46688631,\n",
       "       0.47144926, 0.4734951 , 0.47397494, 0.4740558 , 0.47499812,\n",
       "       0.47467682, 0.4686313 , 0.46901569, 0.47402316, 0.47416183,\n",
       "       0.47449481, 0.46744537, 0.47344136, 0.47223619, 0.4662962 ,\n",
       "       0.47108361, 0.46530566, 0.47453475, 0.47507057, 0.46892339,\n",
       "       0.46862325, 0.4754464 , 0.46935546, 0.46869135, 0.46708989,\n",
       "       0.46549404, 0.471331  , 0.46557194, 0.46267807, 0.46985883,\n",
       "       0.47081983, 0.47203431, 0.4731375 , 0.4691669 , 0.47425592,\n",
       "       0.4741931 , 0.46890005, 0.4752484 , 0.47528893, 0.47547632,\n",
       "       0.47305927, 0.47046167, 0.47078803, 0.47616556, 0.47504431,\n",
       "       0.4699415 , 0.469531  , 0.47026682, 0.47667602, 0.47688255,\n",
       "       0.47133923, 0.47119036, 0.47069442, 0.47739267, 0.47712779,\n",
       "       0.4771516 , 0.47041976, 0.47784621, 0.47751743, 0.47850776,\n",
       "       0.47786957, 0.47827607, 0.47842133, 0.47091925, 0.47198397,\n",
       "       0.46919847, 0.47741652, 0.47789642, 0.47056657, 0.46986133,\n",
       "       0.46990877, 0.47666004, 0.47063982, 0.46949899, 0.47014135,\n",
       "       0.47032526, 0.47618628, 0.46986437, 0.47538063, 0.4773221 ,\n",
       "       0.47013736, 0.47667891, 0.47666371, 0.47698879, 0.4759202 ,\n",
       "       0.47048527, 0.4706066 , 0.47750431, 0.47018397, 0.47694564,\n",
       "       0.46993521, 0.46731496, 0.46817565, 0.47543564, 0.47533241,\n",
       "       0.47695419, 0.47525582, 0.47381106, 0.47575188, 0.47585535,\n",
       "       0.46943861, 0.4692103 , 0.47541267, 0.4699831 , 0.47525677,\n",
       "       0.47008711, 0.47550464, 0.47009197, 0.47764683, 0.47539154,\n",
       "       0.47826189, 0.46971887, 0.47783065, 0.47069597, 0.47882041,\n",
       "       0.4717142 , 0.47857648, 0.47213298, 0.47109944, 0.47697571,\n",
       "       0.47799611, 0.47058114, 0.47110206, 0.47819871, 0.47197431,\n",
       "       0.47190249, 0.47040072, 0.47216034, 0.47790891, 0.47739378,\n",
       "       0.47277206, 0.47835469, 0.47903728, 0.47261024, 0.47660387,\n",
       "       0.47864747, 0.472462  , 0.47879595, 0.47067067, 0.47252828,\n",
       "       0.4802413 , 0.47881579, 0.4788968 , 0.47305104, 0.47269821,\n",
       "       0.47997797, 0.47237158, 0.47961801, 0.48083478, 0.4734174 ,\n",
       "       0.47997916, 0.48044825, 0.47988173, 0.48102248, 0.48214918,\n",
       "       0.47462058, 0.48247883, 0.47526759, 0.47497708, 0.48200059,\n",
       "       0.47543901, 0.48216894, 0.48214319, 0.48244745, 0.484364  ,\n",
       "       0.47602436, 0.47657454, 0.47665435, 0.47652259, 0.48386264,\n",
       "       0.47680977, 0.47521526, 0.47230595, 0.4818286 , 0.48214221,\n",
       "       0.48272878, 0.48297322, 0.47503585, 0.48325205, 0.4732601 ,\n",
       "       0.48234743, 0.48266447, 0.48321322, 0.48310748, 0.4766168 ,\n",
       "       0.48323268, 0.48437804, 0.47659007, 0.48459131, 0.47711256,\n",
       "       0.47637755, 0.4848271 , 0.48428994, 0.48470867, 0.48615509,\n",
       "       0.47821414, 0.48583961, 0.48448187, 0.47718096, 0.486375  ,\n",
       "       0.48665285, 0.47880301, 0.48739833, 0.47962272, 0.47931561,\n",
       "       0.47847289, 0.4871397 , 0.48663658, 0.47865391, 0.4865222 ,\n",
       "       0.48713288, 0.48741284, 0.47873691, 0.47778463, 0.48662189,\n",
       "       0.48676115, 0.48760402, 0.48851416, 0.48859277, 0.48034316,\n",
       "       0.48908246, 0.48942071, 0.47964323, 0.48933288, 0.48910412,\n",
       "       0.49095535, 0.48119158, 0.49258953, 0.49403912, 0.48042107,\n",
       "       0.47902977, 0.48980695, 0.49201649, 0.47992936, 0.49099302,\n",
       "       0.49104241, 0.48233366, 0.49169067, 0.48233968, 0.49268225,\n",
       "       0.48277488, 0.49240106, 0.49325746, 0.49271297, 0.49273485,\n",
       "       0.48321015, 0.48319188, 0.49311155, 0.49450374, 0.4962638 ,\n",
       "       0.48527253, 0.48286074, 0.48281249, 0.49375805, 0.48250061,\n",
       "       0.49271935, 0.48218364, 0.49353474, 0.48407382, 0.48421651,\n",
       "       0.48209637, 0.493476  , 0.48255891, 0.47746003, 0.48933703,\n",
       "       0.49028903, 0.48135403, 0.47992373, 0.47856602, 0.48857641,\n",
       "       0.48995462, 0.4802959 , 0.48953038, 0.48116416, 0.47838002,\n",
       "       0.48840463, 0.48811856, 0.48973551, 0.48965329, 0.47405943,\n",
       "       0.48745924, 0.48888674, 0.48053369, 0.48850536, 0.48019657,\n",
       "       0.47858736, 0.47324041, 0.4854165 , 0.48621577, 0.4855642 ,\n",
       "       0.48585361, 0.48523894, 0.47769943, 0.4779647 , 0.47848544,\n",
       "       0.48415092, 0.47666255, 0.4772574 , 0.4858934 , 0.48599565,\n",
       "       0.47585616, 0.47582829, 0.48426917, 0.47508574, 0.47301996,\n",
       "       0.47484577, 0.47157857, 0.4788886 , 0.47984129, 0.47629851,\n",
       "       0.48316795, 0.483394  , 0.47459179, 0.48238772, 0.4805297 ,\n",
       "       0.47828552, 0.47995985, 0.47398943, 0.47455034, 0.47945398,\n",
       "       0.47427279, 0.47638762, 0.47445726, 0.47591653, 0.48421976,\n",
       "       0.47729793, 0.47311229, 0.46978444, 0.47410631, 0.47413608,\n",
       "       0.48212424, 0.47978696, 0.47490329, 0.47856438, 0.4740257 ,\n",
       "       0.48306733, 0.48022604, 0.47466218, 0.47413644, 0.48027647,\n",
       "       0.47467291, 0.47156247, 0.47021961, 0.48064512, 0.47326922,\n",
       "       0.46978945, 0.47974789, 0.4722105 , 0.47968644, 0.47217652,\n",
       "       0.47899932, 0.47223315, 0.47515789, 0.4759244 , 0.47116116,\n",
       "       0.47201926, 0.46910095, 0.47131515, 0.47076231, 0.47266906,\n",
       "       0.479729  , 0.47222421, 0.47694036, 0.46554154, 0.47017229,\n",
       "       0.4700295 , 0.4719426 , 0.47456658, 0.47854888, 0.47217232,\n",
       "       0.47262248, 0.48232019, 0.47081107, 0.47197962, 0.48069537,\n",
       "       0.47169939, 0.47362182, 0.47974926, 0.4707247 , 0.46701616,\n",
       "       0.47859442, 0.47867876, 0.46472788, 0.47712579, 0.4687047 ,\n",
       "       0.46648592, 0.47142142, 0.47557983, 0.47235739, 0.47195771,\n",
       "       0.47385451, 0.4809621 , 0.47237983, 0.4734478 , 0.47211987,\n",
       "       0.47987342, 0.47412673, 0.47261825, 0.48066199, 0.47358787,\n",
       "       0.47064206, 0.48082668, 0.47326317, 0.48090848, 0.4802686 ,\n",
       "       0.47434396, 0.4735406 , 0.48203954, 0.4819341 , 0.47439981,\n",
       "       0.47264051, 0.48004031, 0.47341016, 0.47257268, 0.47858363,\n",
       "       0.47339004, 0.47332126, 0.47209072, 0.46853986, 0.47732863,\n",
       "       0.47872901, 0.47045836, 0.47724658, 0.47844881, 0.47611296,\n",
       "       0.47233102, 0.4699859 , 0.46910658, 0.47519445, 0.47108746,\n",
       "       0.47874945, 0.47201169, 0.47832173, 0.47150502, 0.47642606,\n",
       "       0.47783196, 0.47322431, 0.47060418, 0.47767153])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "predicted_stock_price"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "2d929347",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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d/cnn3zS3377bXd3P/744/21117zyZMnu7t7YWGhz5o1y7/3ve/5tdde66NHj/YxY8b4448/7o8//rg/+eSTXlZW5iNGjPCePXt6SUmJX3/99V5UVOS7du3a/Zzjxo1zd/ebb77Z77vvPj/00EP98MMP9xNOOMFPOeUU//zzz9PaX8TRJ1DNzIrdvcjMTgOOdvcHaqwrABYR3Jd1KHCiu6dMb4WFha6xg0SSJaM+gX79oL5+w4IC+PDDZsXx0UcfsXnzZn72s5/RsWNHKioqOOecczj55JMBWLZsGWeffTYDBgzggw8+YM2aNaxdu5Y+ffrw8MMP06lTJyZMmMCaNWs444wzmDlzJo888giPPvooixcv5vnnn+fss8/myCOPJDc3FzNj5syZPProo3z729+mW7duHHbYYTz//POMHj2awhR9F62mT6Cah53C7v5yzQQQLlsDjAJ+D4xsKAGIiDTqo48yW56Bzz77jNtuu43hw4dz2223sWHDhlqdszk5OYwbN47i4mIOOeQQtm3bxtixY6moqKhVT0FBASUlJXTu3Hl3s85VV13F3LlzGT16NCNHjuSNN95gw4YNlJaWcthhh/HEE0+wZs0aZs+ezWOPPcY111zD5MmTefbZZ5u9XbFfMezufwPmxR2HiLQBffvWfyTQzA7nhQsXMnXqVHJzc3nggQeYPn06JSUlTJgwAQgSxO233767vLuTm5vL5MmTKSkp2au+VatWsWPHDlauXMnxxx/P7NmzWbhwISUlJTz99NPk5OSwcePG3f0Ir7zyyu7Hjho1ikMPPZQHH3ywWdtULe6OYRGRlhNRh/M3vvENXnnlFZ599lmee+45jj/+eK699lrOO+88FixYwJIlS2jfvj1PPfUURUVFrF8fnPR42WWXMWLEiL3qmzp1Kvn5+bz44ov0rZGgTjjhBBYv3nOW/Pbt29myZQszZ87kzTff5JlnnuG4446jR48e9SaXplASEJG248ILYcaMoA/ALPg7Y0awvJnWr1/P7NmzGTZsGF26dOHKK69k/fr1DB06lF//+tdUVlbubg667LLLaj22Zt/rtm3b2LhxIwUFBbXKvPfee+zatYupU6cCMGfOHP70pz9x3HHH0a9fPzZu3Mhdd93FzTffzFVXXcXkyZN5/fXXm71dkZ8d1JJTk84OEpGsFskVwxnavn27X3755X7vvff6hg0baq0rKyvz6667zrds2eJlZWV7PXbevHl+5JFH+muvvebu7o899pjffffd7u5+xRVX+JgxY/ypp57yY445xteuXetTpkzxBQsW1KqjsrLSp0yZ4htrnMH09ttv+/Lly/d6vlZ3dlBL0tlBIskTyRXD+9C2bdto164dHTt2BKCyspLPPvuMrl27smbNGg455BCqqqrYuXMnXbp0oaqqKuOriGvK9Oyg2DuGRUTastzc3Fr/5+Tk0LVrV4BaTUKdOnUCaFYCaAr1CYiIJJiSgIhIgikJiIgkmJKAiEgGdu7cSVWN4a537dpFVVUVmzdvTvmY1atX88knnwB7zsisasLQ3i+99BLvv/9+5kE3QElARKQBS5YsYdSoUYwdO5ZevXrtHgH0oIMO4swzz+TMM89k6dKljBw5kuLiYs4991wmTJjAeeedx1tvvQXA7Nmzeeutt1rdMNKgJCAibUw6I0lnYvjw4Vx33XUMHDiQBx54gEmTJrFgwQIKCwuZP38+CxcuZNiwYSxatIjevXuTk5PDHXfcweDBg9m4cSOjR4+mffv2tGvXrvUNI42SgIi0IXPnwsSJwfBB7sHfiRObnwjy8vL4wx/+wLhx41i2bBlDhgyhoKCASZMmccwxx7Bs2TJ+//vfc/jhhwMwadIkPv30Uzp06FDr7mNz5sxh0aJFbNmyhZEjR7Js2TIgaGJatGgRY8eO3V12165du+ffeOMN3nnnHR555BEmT57MiBEj2LFjR/M2KqQkICJtxg03wNattZdt3Rosb6q5c+cyZcoU3J2ioiKKi4s5/fTTOeKII7jooovo27cvgwYNYtq0abvb62teC1DT8OHDufPOO1m7di39+/dn/fr1bN68maqqKqZOncq2bduorKykqqqKMWPGcMIJJ3DwwQdz8MEH8+STT3LJJZcwffp0iouLm3xry7qUBESkzYhiJOkLLriA4uJiDjjgAIYMGULPnj0BKCsro3v37gB06dKFBQsW0L9/f9ydnTt30r59e+qOyNDahpEGXTEsIm1IFCNJ17yC94c//CFvvvkmq1evZu3atfTt23f3F/1vf/tb3n//fdq3b09FRQVdunTZnRBqak3DSIOOBESkDYn6FsvVHbMFBQWUl5fTsWNHTjrpJKqqqpg2bRqXXnopF154IQMHDuSDDz6gqKiIa6+9tlYdrWkYaVASEJE2JKqRpKvP7YfgrJ3NmzczYsQILrroIkaMGMHMmTMZOnQoXbp04aabbuKWW26hU6dOPPzwwwwcOJD33nuPnJyc1jeMNGoOEpE25sILW+T2Abvt2LGDoUOHcsEFF7Br1y6uvPJK3J3p06ezbds2xo8fzy233ML48eP5+9//zs0330zv3r25/vrr2bBhAx9//DFf+cpXGDJkCPPmzeO0004DYPLkyVRWVrJu3TpWrVrFPffcQ1VVFQsXLuTqq6/m6quvBqCqqoobb7yR3/zmN3Tu3JnOnTsza9asvZqZmkpDSYtIq9bahpJev349vXr12v3/1q1b6dixIzk5OY0+NuphpEFDSYtIG+TumFncYQDUSgAQXEOQrqiHkW7Kj3r1CYhIq9apUyc2bdrUpC+4JHF3Nm3atDuhpEtHAiLSqvXu3Zt169ZRXl4edyitXqdOnejdu3dGj1ESEJFWrUOHDvTv3z/uMNosNQeJiCSYkoCISIIpCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCSYkoCISIJFmgTMbJaZLTWzG1Os72Zmi8xsiZk9HGUsIiKyt8iSgJmdBeS4+1Cgp5kNqKfYRcAcdx8OdDGzeke5ExGRaER5JFAEzAvnXwaG1VNmEzDQzA4A+gB73QnUzCaaWamZlWrsEBGRlhVlEtgfWB/OVwA96inzGjAA+C7wHvBJ3QLuPsPdC929MD8/P6pYRUQSKcoksAXIDec7p3iuO4FJ7n4rQRK4JMJ4RESkjiiTwHL2NAEdC3xYT5k84MtmlgN8FdCA4SIi+1CUSWA+cJGZ/RgYD6w0s9vrlPkhMAP4J3Ag8ESE8YiISB2R3U/A3SvMrAgYBdzt7mXAijpl3gAGRRWDiIg0LNKbyrj7J+w5Q0hERFoZXTEsIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJFmkSMLNZZrbUzG5spNx0MxsbZSwiIrK3yJKAmZ0F5Lj7UKCnmQ1IUW44cLC7L4gqFhERqV+URwJFwLxw/mVgWN0CZtYBeBT40MzOiDAWERGpR5RJYH9gfThfAfSop8zFwLvA3cAQM/tO3QJmNtHMSs2stLy8PLJgRUSSKMoksAXIDec7p3iu44EZ7l4GzAFOrVvA3We4e6G7F+bn50cWrIhIEqWdBMysffh3dI1lXzWz41I8ZDl7moCOBT6sp8xfgUPD+UJgTbrxiIhI86WVBMysHfB8+O/YcFkhMA3YmeJh84GLzOzHwHhgpZndXqfMLOBUM3sVuAK4J6PoRUSkWdo3tNLMDgcOAbYBeWb2FeDLZvYQ8DHwdXf/R32PdfcKMysCRgF3h00+K+qU2Qyc29yNEBGRpmkwCQB9gcFAJdAN+BpBB+8Ogs7e7Q092N0/Yc8ZQiIi0so02Bzk7i+HZYaHf58HXnb30cBi4Hdm1i3yKEVEJBLp9Ak8DfwIuJ+gE/eDcPnHwJ3ANdGEJiIiUUsnCfwOGE3QHHQg8H/C5ccTNBP9dzShiYhI1BrrEwBY4+63ApjZG8BfzewXBOf+/zFsMhIRkSyUzpFAvpn9fzP7FcEQD5uBTQTNQSOjDE5ERKLV6JGAu3+pet7MjKB56PNw0b9FFJeIiOwDmQ4bYUAfd98UTj8xs9OjCExERKLXaBIws/vM7JvhUUAucK8FRpjZM8DQyKMUEZFIpHMk8EPgCOBFYGA4PQ38C1ACTI8sOhERiVQ6SWAiwbDQrwPnEHQMlxI0DQ0guGBs/8giFBGRyKRziugiwMP5rgTXCVTfBWwh0JvUg8iJiEgrlk4SmA/8Afiqu/cxs+OBN4GPCI4G2hGcMSQiIlmmsVFEDfiru59jZi+a2SPAVqDc3b8ZlnmAYKTRtZFHKyIiLarBJODubmaPmFku8K8ETT+fAZ3NrI+7r3X3K/dFoCIi0vLS6Rg+k6DZ5xRgJsHdwHYAd5jZ78zsGjPrHF2IIiISlXT6BP7d3bea2X7Ame5eCbwDXGxmnQjOGPosyiBFRCQa6RwJ9AVw97nu/hGAmV0druvq7nPc3VM9WEREWq8Gk0B4b+H7zWy8mf3UzK4zs+EEt4wE+GV4C8pWa+5c6NcP2rUL/s6d2/yymdQZpyjijHt/xr1N2VBn3PszXW0xzqzk7g1OBHcQuxMoBF4AvkdwxfA3gIcae3xLToMHD/ZMzJnjnpfnDnumvLxgeVPLZlJndfmCAnez4G9zy6VbNoo4496fmZZNd7+3pTrj3p/plm2LcWby/C0dZ2OAUk/1HZ9qxe4C8BYwh6CD+AXgqjAJdAHyG3t8S06ZJoGCgtovXvVUUND0spnUGecHN4o4496f6ZbNZH+2tTrj3p9xvpfijjPuRN2Q5iaB1UAxwRhCz4dJ4HfAt4AJQI/G6mipKdMkYFb/C2jW9LKZ1BnnBzeKOOPen+mWzWR/trU6496fcb6X4o4zzs97YxpKAul0DP8jTASLCU4VrWZAf+AHGbdB7SN9+6a/PN2ymdT50Uf1l627PN1ymZSNIs6492e6ZTPZn22tzrj3Z5zvpbjjjPPz3iypskP1RHBj+VeBqew5EqhuDuoODGysjpaasq1PIFsO4eM83M6WQ/hsqTPu/ZktTTdtrcmuMTSzOWgxQcdwX4I+ge+HSeBi4NbGHt+SU6ZJwD2aDpi21pkXZ8dbFHVG0ZmXLXVmUi6KOLOlEzfOz1E29gm8AnyboB/gR8AYYEG4bgEwoLE6WmpqShKIW2s9W2Bf1BmnbNlH2bLf435/pivuOFvr572hJGDB+tTM7CR3f93MvuPu94fLrnD36WbWCxgPPOruW1qgdapBhYWFXlpaGvXTiIi0KWa23N0L61uXTsfwUWY2AZhsZoeY2UrgADPrBjhwGcHIoiIikmXSSQLXAPsRdAi3Az4BVgC/BH4NXOnuVZFFKCIikUknCWwjuJfwy+H/OwjuHbCdYAC6dAahExGRViidJPAC8O8EVw4PDqcLgMuBU4FbzewLkUUoIiKRSedX/GKCX//vECSNS4GPgcMI+gQeA3KBf0YUo4iIRCSdI4FpBL/+LwcOJbheYBbBgHInAd8Byut7oJnNMrOlZnZjQ09gZj3M7K1MAhcRkeZL50ignKAT+OvArwiGizgTuNfd3cz+GtZTWfNBZnYWkOPuQ81supkNcPe/pHiOewiOJkREZB9KJwmUAXcBGwm+rA3YApSY2VbgSWBnPY8rAuaF8y8Dw4C9koCZnUZwZ7Ky+p7czCYCEwH6phrIQ0REmqTRJODu56ZaZ2YHAWelOEV0f2B9OF8B7HXzmfCWlTcRHFnMT/H8M4AZEFws1li8IiKSvnT6BFJy903u/miK1VvY08TTOcVz/RfwoLt/2pw4RESkaZqVBBqxnKAJCOBY4MN6yowkuBK5GDjOzGZGGI+IiNQR5YVe84ElZtaToFP5fDO73d13nynk7idXz5tZsbtfGmE8IiJSR2RJwN0rzKyI4Kb0d7t7GcFwE6nKF0UVi4iI1C/SIR/c/RP2nCEkIiKtTJR9AiIi0sopCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCSYkoCISIIpCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCSYkoCISIIpCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCSYkoCISIIpCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCSYkoCISIIpCYiIJJiSgIhIgikJiIgkmJKAiEiCKQmIiCRYpEnAzGaZ2VIzuzHF+i+Y2TNm9oKZPWVm+0UZj4iI1BZZEjCzs4Acdx8K9DSzAfUUuxD4sbuPAsqAMVHFIyIie2sfYd1FwLxw/mVgGPCXmgXcfXqNf/OBv0cYj4iI1BFlc9D+wPpwvgLokaqgmZ0EdHP3ZfWsm2hmpWZWWl5eHk2kIiIJFWUS2ALkhvOdUz2XmR0I3A98q7717j7D3QvdvTA/Pz+SQEVEkirKJLCcoAkI4Fjgw7oFwo7gecAUd18TYSwiIlKPKJPAfOAiM/sxMB5YaWa31ynzbWAwcIOZFZvZeRHGIyIidUTWMezuFWZWBIwC7nb3MmBFnTIPAQ9FFYOIiDQsyrODcPdP2HOGkIiItDK6YlhEJMGUBEREEkxJQEQkwZQEREQSTElARCTBlARERBJMSUBEJMGUBEREEkxJQEQkwZQEREQSTElARCTBlARERBJMSUBEJMGUBEREEkxJQEQkwZQEREQSTElARCTBlARERBJMSUBEJMGUBEREEkxJQEQkwZQEREQSTElARCTBlARERBJMSUBEJMGUBEREEkxJQEQkwZQEREQSTElARCTBlARERBJMSaAp5s6Ffv2gXbvg79y5zS+bSZ1RxJktsmU/Zcu+j/P9mYls+RxFEWfU+97dI5uAWcBS4MbmlKmeBg8e7LGbM8c9L88d9kx5ecHyppbNpM4o4swW2bKfsmXfx/n+zJY44/68t9A2AaWe6js41YrmTsBZwM/C+enAgKaUqTm1iiRQUFD7BameCgqaXjaTOqOIM1tky37Kln0f5/szW+KM+/PeQtvUUBKwYH3LM7NpwLPuvsjMzgG6uPtPm1BmIjARoG/fvoPXrFkTSbxpa9cueBnqMoOqqqaVzaTOKOLMFtmyn7Jl38f5/sxEtnyOooizhbbJzJa7e2F966LsE9gfWB/OVwA9mlLG3We4e6G7F+bn50cSaEb69k1/ebplM6kzXVHUGbds2U/Zsu/jfH9mIls+R1HEuQ/2fZRJYAuQG853TvFc6ZRpXe64A/Lyai/LywuWN7VsJnVGEWe2yJb9lC37Ps73Zyay5XMURZz7Yt+naidq7gRcDPxHOP8D4F+bUqbm1Cr6BNyDTpmCAnez4G9DnTTpls2kzijizBbZsp+yZd/H+f7MRLZ8jqKIswW2iZj6BLoCS4CXgK8D5wPnuvuNDZQ50d3/marOwsJCLy0tjSReEZG2KpY+AXevAIqAZcCp7r6iZgJIUSZlAhARkZbXPsrK3f0TYF5zy4iISDRaf0esiIhERklARCTBlARERBIssrODomBm5UBTLxnuDmxswXBag7a2TW1te6DtbVNb2x5oe9tU3/YUuHu9V9tmVRJoDjMrTXWKVLZqa9vU1rYH2t42tbXtgba3TZluj5qDREQSTElARCTBkpQEZsQdQATa2ja1te2BtrdNbW17oO1tU0bbk5g+ARER2VuSjgRERKQOJQERkSxnZgea2Sgz657pYxORBMxslpktNbMbGy/duplZezP7yMyKw+nLccfUHGbWw8yWhPMdzGxh+Fp9K+7YmqrONvUys3U1Xq9WcGek9JnZF8zsGTN7wcyeMrP9svnzlGJ7svrzZGaHAL8DhgCLzSw/k9eozScBMzsLyHH3oUBPMxsQd0zNdAzwhLsXhdM7cQfUVGbWDfg5wR3mAL5DMO75UOAbZtYltuCaqJ5t+ipwR43Xqzy+6JrkQuDH7j4KKCMYEj6bP091t+e/yP7P0yDge+5+B/AccBoZvEZtPgkQDFVdPUrpy8Cw+EJpEScC48zsNTOba2aRjgQbsUrgPIJbi0Lt12opkI0X8NTdphOBK8zsdTO7N76wmsbdp7v7C+G/+cC/kcWfp3q2ZxdZ/nly9xfdfZmZnUxwNPA1MniNkpAE0rnXcTYpAU5x92HAp8Dp8YbTdO5eUeceEln/WtWzTc8AQ939JOAIMzsmptCaxcxOAroBa8ny1whqbc8LtIHPk5kZwY+PnYCRwWuUhCSQffcxbtjb7r4hnH8PyLbD8Ya0tdcKYKm7bw7ns/L1MrMDgfuBb9EGXqM629MmPk/hXSQnExxBn0gGr1HWvYBNsJw9h0PHAh/GF0qLeNzMjjWzHGAcsCLugFpQW3utAJ4zs0PMLI/gMP1PcQeUCTPbj6BpYYq7ryHLX6N6tifrP09mdp2ZXRz+ewBwFxm8RlnX/tUE84ElZtaT8D7G8YbTbLcCvyA45Hva3V+MOZ6W9HNgkZkNB44G/hBzPC3hB8BiYAfwsLv/OeZ4MvVtYDBwg5ndAPwUuCiLP091t2cx8DjZ/XmaAcwzs0sJfmTMB15N9zVKxBXD4Rkbo4BX3b0s7ngktfCNOwx4Tvecbp30eWr9MnmNEpEERESkfknoExARkRSUBEREEkxJQKSFmNlBZnZBON8hPHdbpFVTn4BIM5jZd4Gd7v6QmXUE3gfGAlMILtKpCosOBvq7+6exBCqSQhJOERVplvBy/CeAvwBHuXvNKzArgR3heeYHAt8Hytz9gjp1FAOf75uIRdKnJCDSuErgKXe/0sxKwhFOv0Qw7syxBL/2dwET3f1fzOy5MClUGxP+1WG3tDpKAiKNqyQYZOxLwBfdfbaZ9XH3tWY2CdgOPAlcEpZv7+4jIDgCcPdd6h6Q1kodwyKNqz4SKAI2mFkusMDMuqYof6SZvWhmLxIcKYi0WjoSEGlczR9L5u7bzOxB4IQU5Ve5+0jY3Rcg0mopCYg0rj17moN6Abj7owApbthxXHgUAHBsNo5RL8mhN6dI43LY0zF8c5111Y397arn3X2v+7yGo1dW1V0uEjclAZHGlQJ/BnD3H1QvNLNzge8ClxKM296xvgeb2VyCzuId0YcqkhldLCbSRGEHcZW7N3j+v5l1qXFjGZFWRUlARCTBdIqoiEiCKQmIiCSYkoCISIIpCYiIJJiSgIhIgv0vmRGMPKTrbkgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出真实数据和预测数据的对比曲线\n",
    "x = real_stock_price[:30]\n",
    "y = predicted_stock_price[:30]\n",
    "plt.scatter(list(range(len(x))),x,c='red',label='实时涨跌')\n",
    "plt.scatter(list(range(len(y))),y,c='blue',label='预测涨跌')\n",
    "plt.title('股票涨跌预测')\n",
    "plt.xlabel('时间')\n",
    "plt.ylabel('股票涨跌')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "dd0c9962",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "均方误差: 0.252181\n",
      "均方根误差: 0.502176\n",
      "平均绝对误差: 0.501335\n"
     ]
    }
   ],
   "source": [
    "# 评估\n",
    "# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)\n",
    "mse = mean_squared_error(predicted_stock_price, real_stock_price)\n",
    "# calculate RMSE 均方根误差--->sqrt[MSE]    (对均方误差开方)\n",
    "rmse = math.sqrt(mean_squared_error(predicted_stock_price, real_stock_price))\n",
    "# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值）\n",
    "mae = mean_absolute_error(predicted_stock_price, real_stock_price)\n",
    "print('均方误差: %.6f' % mse)\n",
    "print('均方根误差: %.6f' % rmse)\n",
    "print('平均绝对误差: %.6f' % mae)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "551cf138",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确率：0.13199487541403088\n"
     ]
    }
   ],
   "source": [
    "#ACC\n",
    "error = 0\n",
    "summery = 0\n",
    "for i in range(24):\n",
    "    error += abs(predicted_stock_price[i] - real_stock_price[i])\n",
    "    summery += real_stock_price[i]\n",
    "acc = 1 - error/summery\n",
    "print(\"准确率：{}\".format(acc))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "c429f402",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
